import GameEvent from "./GameEvent";
import WxShare from "./WxObje/WxShare";
import WxRomminfo from "./WxObje/WxRoomInfo";
import WxUserInfo from "./WxObje/WxUserInfo";
import WxMember from "./WxObje/WxMember";
import MaoRandom from "./MaoRandom";



export default class GameWx extends Laya.EventDispatcher {

    wx = Laya.Browser.window.wx;
    server: any = null;

    roominfo: WxRomminfo;
    userinfo: WxUserInfo

    //key1 = "";
    accessInfo = "";
    clientId = "";

    my:WxMember;

    private sfCallbackHandler;
    

    roomdata = {
        maxMemberNum: 2,
        startPercent: 0,
        gameLastTime: 180,
        needUserInfo: true,
        needGameSeed: true,
        success: null
    }

    private static _i_gamewx: GameWx;
    public static get I() {
        if (!this._i_gamewx) {
            this._i_gamewx = new GameWx();
        }
        return this._i_gamewx;
    }

    private constructor() {
        super();
        this.wx = Laya.Browser.window.wx;
        let wx = this.wx;
        //监听小游戏隐藏到后台事件。锁屏、按 HOME 键退到桌面、显示在聊天顶部等操作会触发此事件。
        if (wx) {
            wx.onShow(this.onShow);
            wx.onHide(this.onHide);
            this.server = wx.getGameServerManager();
            wx.setKeepScreenOn({
                keepScreenOn: true
            });
        }       
        this.roomdata.success = this.room_success.bind(this);
        this.sfCallbackHandler = this.sfCallback.bind(this);
        this.on(GameEvent.Event_WX_Room_Success,this,this.gameinfo_s);
    }

    public get seed(){
        if(this.roominfo){
            return parseFloat(  this.roominfo.seed );
        }
        return 5;
    }

    gameinfo_s(){
        if(this.roominfo){
            

            var arr = this.roominfo.memberList;        
            for (let i = 0; i < arr.length; i++) {
                const e = arr[i] as WxMember;
                if(e.clientId+"" == GameWx.I.clientId){                
                    this.my = e;
                    break;
                }
            }
        }
    }

    init_() {
        var wx = this.wx;
        if (wx) {
            this.server.onRoomInfoChange((res) => {
                console.log(" onRoomInfoChange ");
                console.log(res);                                
                GameWx.I.roominfo = res as WxRomminfo;
                GameWx.I.event(GameEvent.Event_WX_Room_Success, [res]);
                if(GameWx.I.roominfo.roomState == 2){
                    GameWx.I.event(GameEvent.Event_WX_Game_Start);
                }
            });

            var obj = wx.getLaunchOptionsSync();
            if (obj && obj.query && obj.query.key1) {
                this.accessInfo = obj.query.key1;
                GameWx.I.event(GameEvent.Event_WX_OnShow, obj);
                // if(wx.getLaunchOptionsSync){
                //     var los = wx.getLaunchOptionsSync();
                //     // scene	number	启动小游戏的场景值
                //     // query	Object	启动小游戏的 query 参数
                //     // shareTicket	string	shareTicket，详见获取更多转发信息
                //     // referrerInfo	object	来源信息。从另一个小程序、公众号或 App 进入小程序时返回。否则返回 {}。(参见后文注意)
                //     //this.onShow(los);
                //     if(los){
                //         GameWx.I.event( GameEvent.Event_WX_OnShow , [los.query]);
                //     }
                // }

            }
        }
    }

    onShow(res) {
        // scene	string	场景值
        // query	Object	查询参数
        // shareTicket	string	shareTicket
        // referrerInfo	object	当场景为由从另一个小程序或公众号或App打开时，返回此字段
        // referrerInfo 的结构

        // 属性	类型	说明
        // appId	string	来源小程序或公众号或App的 appId
        // extraData	object	来源小程序传过来的数据，scene=1037或1038时支持
        //console.log( res.query );

        if (res && res.query && res.query.key1) {
            this.accessInfo = res.query.key1;
            GameWx.I.event(GameEvent.Event_WX_OnShow, res);
            console.log(" gamewx onshow ", GameWx.I.accessInfo);
        }
    }

    onHide() {

    }

    shareAppMessage() {
        var wx = Laya.Browser.window.wx;
        if (wx) {
            var obj = new WxShare();
            obj.query = "key1=" + GameWx.I.accessInfo;
            wx.shareAppMessage(obj);
            // 属性	类型	默认值	必填	说明	最低版本
            // title	string		否	转发标题，不传则默认使用当前小游戏的昵称。	
            // imageUrl	string		否	转发显示图片的链接，可以是网络图片路径或本地图片文件路径或相对代码包根目录的图片文件路径。显示图片长宽比是 5:4	
            // query	string		否	查询字符串，从这条转发消息进入后，可通过 wx.getLaunchOptionsSync() 或 wx.onShow() 获取启动参数中的 query。必须是 key1=val1&key2=val2 的格式。	
            // imageUrlId	string		否	审核通过的图片 ID，详见 使用审核通过的转发图片	2.4.3
        }
    }

    getUser() {
        var wx = this.wx;
        if (wx) {
            wx.getUserInfo({
                success(res) {
                    console.log("success ",res);
                    GameWx.I.userinfo =  res.userInfo;
                    GameWx.I.event(GameEvent.Event_WX_UserInfo, res);
                },
                fail: this.btnUser.bind(this)
            });
        }
    }

    btnUser(res) {
        //console.log('fail btnuser',res);
        let wx = this.wx;
        let button = wx.createUserInfoButton({
            type: 'text',
            text: '获取用户信息',
            style: {
                left: 10,
                top: 76,
                width: 200,
                height: 40,
                lineHeight: 40,
                backgroundColor: '#ff0000',
                color: '#ffffff',
                textAlign: 'center',
                fontSize: 16,
                borderRadius: 4
            }
        });
        button.onTap((res) => {
            button.hide();
            GameWx.I.userinfo =  res.userInfo;
            GameWx.I.event(GameEvent.Event_WX_UserInfo, res);
        });
    }
    //创建房间
    getRoom() {
        if (this.server) {
            this.server.login().then(() => {
                //console.log(this.server);
                this.server.createRoom(GameWx.I.roomdata);
            });
        }
    }

    joinRoom() {
        if (this.server) {
            this.server.login().then(() => {
                //console.log(this.server);
                this.server.joinRoom({ accessInfo: this.accessInfo, success: this.join_success.bind(this) });
            });
        }
        //this.server.onSyncFrame(this.sfCallbackHandler);
    }

    join_success(res) {
        this.clientId = res.data.clientId;
        console.log("join_success 我得ID ", this.clientId);
        this.server.onSyncFrame(this.sfCallbackHandler);
        this.server.getRoomInfo({
            success: (res) => {
                GameWx.I.roominfo = res.data.roomInfo as WxRomminfo;
                GameWx.I.event(GameEvent.Event_WX_Room_Success, [res.data.roomInfo]);
            }
        });
    }

    room_success(res) {
        if (res.data.accessInfo) {
            this.accessInfo = res.data.accessInfo;
        }
        this.clientId = res.data.clientId;
        console.log("room_success 我得ID ", this.clientId);
        this.server.getRoomInfo({
            success: (res) => {
                GameWx.I.roominfo = res.data.roomInfo as WxRomminfo;
                GameWx.I.event(GameEvent.Event_WX_Room_Success, [res.data.roomInfo]);
            }
        });

    }

    startGame() {
        this.server.onSyncFrame(this.sfCallbackHandler);
        this.server.onGameStart(()=>{
            GameWx.I.event(GameEvent.Event_WX_Game_Start);
        });
        this.server.startGame();
    }

    isFZ:boolean = false;



    private sfCallback(res: any) {
        //res.frameId//	number	帧号，从 1 开始递增
        GameWx.I.event(GameEvent.Event_WX_SyncFrame, res);
    }


    uploadFrame(data) {
        this.server.uploadFrame({ actionList: data, fail: this.loadFrameFail.bind(this) });
    }

    loadFrameFail() {
        console.log("调用接口失败");
    }

    endGame() {
        this.server.offSyncFrame(this.sfCallbackHandler);
        this.server.endGame({ success: this.endGameCom.bind(this) });
        // this.server.endGame();
    }

    endGameCom() {
        GameWx.I.event(GameEvent.Event_WX_EndGame);
        this.server.ownerLeaveRoom({ accessInfo: this.accessInfo, success: this.ownerLeaveRoom.bind(this) });
        this.accessInfo = "";
    }

    ownerLeaveRoom() {
        this.server.logout().then(() => {
            GameWx.I.event(GameEvent.Event_WX_Room_logout);
        });
    }
}

/**
maxMemberNum	number		是	房间最大人数
startPercent	number	0	否	需要满足百分比的玩家都发送了开始指令才能启动游戏。有效范围 0~100，0 表示只要有一个人调用开始就启动，100 表示要求所有人都开始才能启动。
needUserInfo	boolean	false	否	是否需要用户头像和昵称
gameLastTime	number	1200	否	游戏对局时长，到达指定时长时游戏会结束，最大值 3600。
roomExtInfo	string		否	游戏自定义的关于房间扩展信息，其他人可在 RoomInfo 中读取到最多 32 个字节
memberExtInfo	string		否	游戏自定义的关于个人的扩展信息，其他人可在 MemberInfo 中读取到，最多 32 个字节
needGameSeed	boolean	false	否	是否需要生成游戏随机种子，设置为 true，房间信息会携带 gameSeed 属性
success	function		否	接口调用成功的回调函数
fail	function		否	接口调用失败的回调函数
complete	function		否	接口调用结束的回调函数（调用成功、失败都会执行
 */